#include "drv_wifi.h"
#include "drv_systick.h"
#include <string.h>
volatile int esp_connected = 0;   // ESP连接状态：0=未连接，1=已连接
volatile int net_transfer = 0;    // 透传模式标志：0=AT指令模式，1=透传模式
void drv_esp_init(void)
{
	char cmd[64];
    
    // 等待模块启动
    drv_systick_ms(1500);
    
    // 发送AT指令初始化（带超时检测）
    send_at_cmd("AT+RST\r\n", "OK", 2000);
    drv_systick_ms(1500);
    
    send_at_cmd("AT+CWMODE=1\r\n", "OK", 1000);
    drv_systick_ms(1000);
    
    // 连接WiFi（替换为实际SSID和密码）
    sprintf(cmd, "AT+CWJAP=\"hqyjcs\",\"hqyj2022\"\r\n");
    if (send_at_cmd(cmd, "GOT IP", 5000))
    {
        esp_connected = 1;
        drv_systick_ms(1000);
        
        // 启动TCP服务器
        send_at_cmd("AT+CIPSERVER=1,8080\r\n", "OK", 1000);
        drv_systick_ms(500);
        
        // 进入透传模式
        send_at_cmd("AT+CIPMODE=1\r\n", "OK", 1000);
        send_at_cmd("AT+CIPSEND\r\n", ">", 1000);
        net_transfer = 1;  // 开启透传模式
    }
    else
    {
        // WiFi连接失败，可添加重试逻辑
        esp_connected = 0;
    }
}
void drv_esp_send(char* data)
{
    int i = 0;
    // 向ESP-12F发送数据（透传模式下直接转发到网络）
    for (i = 0; data[i]; i++)
    {
        while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
        USART_SendData(USART3, data[i]);
    }
}
int send_at_cmd(char* cmd, char* expect, int timeout_ms) // 发送AT指令并等待响应（带超时）
{
    int timeout = 0;
    char response[128] = {0};
    int resp_len = 0;
    
    // 发送AT指令
    drv_esp_send(cmd);
    drv_systick_ms(100);
    
    // 等待响应
    while (timeout < timeout_ms)
    {
        drv_systick_ms(10);
        timeout += 10;
        
        // 模拟接收响应（实际应在中断中处理）
        if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET)
        {
            char data = USART_ReceiveData(USART3);
            if (resp_len < 127)
            {
                response[resp_len++] = data;
                response[resp_len] = '\0';
            }
        }
        
        // 检查是否收到预期响应
        if (strstr(response, expect) != NULL)
        {
            return 1;  // 响应成功
        }
    }
    
    return 0;  // 响应超时
}
